package ru.inse.core.common;

/**
 * Клас для формирования ключа из набора объектов 
 * @author evga
 *
 */
public class ComplexKey
{
    private Integer hash = Integer.valueOf(0);

    public static ComplexKey newInstance(Object... objects)
    {
        return new ComplexKey(objects);
    }

    private ComplexKey(Object... objects)
    {
        int h = 7;
        for (Object o : objects)
        {
            h = accumulateHashCode(h, o);
        }
        hash = Integer.valueOf(h);
    }

    @Override
    public boolean equals(Object obj)
    {
        //проверка на один и тотже экзампляр объекта
        if (this == obj)
        {
            return true;
        }
        // проверка на соответствие класов
        if ((obj == null) || (obj.getClass() != this.getClass()))
        {
            return false;
        }
        return hash.equals(((ComplexKey)obj).hash);
    }

    @Override
    public int hashCode()
    {
        return hash;
    }

    private static int accumulateHashCode(int accumulateTo, Object obj)
    {
        return 31 * accumulateTo + (obj == null ? 0 : accumulateTo + obj.hashCode());
    }
}
